第13章 数据类型的转换
13.1 基本概念
数据类型转换:把一种数据类型的值转为另一种类型,解决不同类型混合运算、传参、赋值不兼容问题。 分为两大类:隐式转换(自动)、显式转换(强制)。
13.2 隐式转换(自动转换)
编译器自动完成,无需手动书写转换代码。
转换总规则:小范围/低精度 → 大范围/高精度
整数优先级从小到大:char < short < int < long < long long
浮点优先级:float < double
混合运算:整数会自动转浮点。
常见触发场景
- 赋值:右边类型自动匹配左边
int a = 5;
double b = a; // int → double 自动转换
- 四则混合运算:统一提升为高精度类型
int x = 2;
float y = 3.5;
float res = x + y; // x转为float再相加
- 函数传参:实参自动匹配形参类型
隐式转换风险
- 大类型赋值给小类型:精度丢失、数值溢出
double d = 3.9;
int i = d; // 自动截断小数,i=3
- 有符号与无符号混合运算:负数变成超大正数,逻辑出错
int a = -1;
unsigned int b = 2;
if(a < b) // 实际判断为假,异常
13.3 显式转换(强制转换)
手动写明转换,覆盖自动转换规则,分C风格、C++四种专用转换。
13.3.1 C风格强制转换
语法:(目标类型)表达式
double pi = 3.14;
int num = (int)pi; // 舍弃小数
13.3.2 C++四种强制转换
static_cast最常用 基础类型互相转换、无继承关系类转换,安全常规转换:
float f = 5.8;
int n = static_cast<int>(f);
const_cast仅用来去掉变量const只读属性,仅限指针/引用。reinterpret_cast底层重新解释内存(指针与整数互转),风险极高,极少使用。dynamic_cast面向对象,用于父子类指针安全转换,运行校验。
13.4 转换常见问题解决
- 浮点转整数丢失小数:加0.5实现四舍五入
double x = 3.6;
int a = static_cast<int>(x + 0.5); // a=4
- 防止有/无符号比较出错:统一转为long long再比较
- 大数转小数前先判断数值是否在目标类型区间,避免溢出
13.5 C与C++转换对比
- C:只有
(类型)一种强制转换,无检查,风险高 - C++:兼容C风格,新增四种专用转换,编译/运行有校验,更安全